package com.freak.neteasecloudmusic.app.api;

import com.freak.neteasecloudmusic.modules.base.entity.LoginStatusEntity;
import com.freak.neteasecloudmusic.modules.find.recommend.base.entity.NewAlbumEntity;
import com.freak.neteasecloudmusic.modules.find.recommend.base.entity.RecommendEveryDayEntity;
import com.freak.neteasecloudmusic.modules.find.recommend.base.entity.RecommendnewSongEntity;
import com.freak.neteasecloudmusic.modules.find.recommend.base.fragment.entity.RankingListEntity;
import com.freak.neteasecloudmusic.modules.find.recommend.entity.BannerEntity;
import com.freak.neteasecloudmusic.modules.find.recommend.entity.HotSongListCategoryEntity;
import com.freak.neteasecloudmusic.modules.find.recommend.entity.HotSongListEntity;
import com.freak.neteasecloudmusic.modules.find.recommend.entity.SongListCategoryEntity;
import com.freak.neteasecloudmusic.modules.find.recommend.entity.SongListDetailEntity;
import com.freak.neteasecloudmusic.modules.find.recommend.entity.SongListEntity;
import com.freak.neteasecloudmusic.modules.find.recommend.entity.SongUrlEntity;
import com.freak.neteasecloudmusic.modules.find.recommend.songlist.detail.comment.entity.CommentEntity;
import com.freak.neteasecloudmusic.modules.find.recommend.songlist.fragment.entity.RecommendEntity;
import com.freak.neteasecloudmusic.modules.login.entty.LoginEntity;
import com.freak.neteasecloudmusic.modules.mine.entity.MinePlayListEntity;
import com.freak.neteasecloudmusic.modules.mine.entity.MinePurchasedEntity;
import com.freak.neteasecloudmusic.modules.mine.entity.MineRadioStationEntity;
import com.freak.neteasecloudmusic.modules.mine.entity.MineRecordEntity;
import com.freak.neteasecloudmusic.modules.mine.entity.MineUserDetailEntity;
import com.freak.neteasecloudmusic.modules.mine.entity.MineUserInfoEntity;
import com.freak.neteasecloudmusic.modules.mine.entity.PersonFmEntity;
import com.freak.neteasecloudmusic.modules.mine.entity.RecommendRadioStationEntity;
import com.freak.neteasecloudmusic.modules.video.entity.VideoEntity;
import com.freak.neteasecloudmusic.modules.video.entity.VideoTagEntity;

import io.reactivex.Observable;
import retrofit2.http.POST;
import retrofit2.http.Query;

/**
 * @author freak
 * @date 2019/2/19
 */
public interface ApiService {
    /**
     * 用户登陆
     *
     * @return
     */
    @POST("login/cellphone")
    Observable<LoginEntity> login(@Query("phone") String phone,
                                  @Query("password") String password
    );

    /**
     * 检查登录状态
     *
     * @return
     */
    @POST("login/status")
    Observable<LoginStatusEntity> loadLoginStatus();

    /**
     * 加载轮播图
     *
     * @return
     */
    @POST("banner")
    Observable<BannerEntity> loadBanner();

    /**
     * 歌单分类类别列表
     *
     * @param order  可选值为 'new' 和 'hot', 分别对应最新和最热 , 默认为 'hot'
     * @param cat    比如 " 华语 "、" 古风 " 、" 欧美 "、" 流行 ", 默认为 "全部",可从歌单分类接口获取(/playlist/catlist)
     * @param limit  取出歌单数量 , 默认为 20
     * @param offset 分页起始位置 从0开始
     * @return
     */
    @POST("top/playlist")
    Observable<SongListEntity> loadSongListCategoryList(@Query("order") String order,
                                                        @Query("cat") String cat,
                                                        @Query("limit") int limit,
                                                        @Query("offset") int offset);

    /**
     * 歌单分类类别
     *
     * @return
     */
    @POST("playlist/catlist")
    Observable<SongListCategoryEntity> loadSongListCategory();

    /**
     * 热门歌单分类类别
     *
     * @return
     */
    @POST("playlist/hot")
    Observable<HotSongListCategoryEntity> loadSongListCategoryHot();

    /**
     * 获取精品歌单类别列表
     *
     * @param cat    比如 " 华语 "、" 古风 " 、" 欧美 "、" 流行 ", 默认为 "全部",可从歌单分类接口获取
     * @param limit  取出歌单数量 , 默认为 20
     * @param before 分页参数,取上一页最后一个歌单的 updateTime 获取下一页数据
     * @return
     */
    @POST("top/playlist/highquality")
    Observable<HotSongListEntity> loadQualitySongList(@Query("cat") String cat,
                                                      @Query("limit") int limit,
                                                      @Query("bre") long before);

    /**
     * 推荐歌单列表
     *
     * @param limit
     * @return
     */
    @POST("personalized")
    Observable<RecommendEntity> getRecommendSongList(@Query("limit") int limit);

    /**
     * 歌单 ( 网友精选碟 )
     *
     * @param cat    比如 " 华语 "、" 古风 " 、" 欧美 "、" 流行 ", 默认为 "全部",可从歌单分类接口获取
     * @param limit  取出歌单数量 , 默认为 20
     * @param before 分页参数,取上一页最后一个歌单的 updateTime 获取下一页数据
     * @return
     */
    @POST("top/playlist/highquality")
    Observable loadQualitySongListWy(@Query("cat") String cat,
                                     @Query("limit") int limit,
                                     @Query("before") String before);

    /**
     * 获取歌单详情
     *
     * @param id 歌单 id 必选参数
     * @param s  歌单最近的 s 个收藏者 可选参数
     * @return
     */
    @POST("playlist/detail")
    Observable<SongListDetailEntity> loadSongListCategoryDetail(@Query("id") String id,
                                                                @Query("s") String s);

    /**
     * 获取音乐播放地址
     *
     * @param id
     * @return
     */
    @POST("song/url")
    Observable<SongUrlEntity> loadSongUrl(@Query("id") String id);

    /***
     * 检查音乐是否可以使用
     * 调用此接口,传入歌曲 id, 可获取音乐是否可用,返回 { success: true, message: 'ok' } 或者 { success: false, message: '亲爱的,暂无版权' }
     * @param id 歌曲 id
     * @param br 码率,默认设置了 999000 即最大码率,如果要 320k 则可设置为 320000,其他类推
     * @return
     */
    @POST("check/music")
    Observable checkSongUrl(@Query("id") String id,
                            @Query("br") String br);

    /**
     * 歌单评论
     *
     * @param id     专辑 id
     * @param limit  取出评论数量 , 默认为 20
     * @param offset 偏移数量 , 用于分页 , 如 :( 评论页数 -1)*20, 其中 20 为 limit 的值
     * @param before 分页参数,取上一页最后一项的 time 获取下一页数据(获取超过5000条评论的时候需要用到)
     * @return
     */
    @POST("comment/playlist")
    Observable<CommentEntity> getCommentList(@Query("id") String id,
                                             @Query("limit") String limit,
                                             @Query("offset") String offset,
                                             @Query("before") String before);

    /**
     * 获取视频标签列表
     *
     * @return
     */
    @POST("video/group/list")
    Observable<VideoTagEntity> getVideoTag();

    /**
     * 获取视频标签下的视频
     *
     * @param id videoGroup 的 id
     * @return
     */
    @POST("video/group")
    Observable<VideoEntity> getVideo(@Query("id") String id);

    /************************* 用户信息相关 **************************************/
    /**
     * 获取用户详情
     * 说明 : 登陆后调用此接口 , 传入用户 id, 可以获取用户详情
     *
     * @return
     */
    @POST("user/detail")
    Observable<MineUserDetailEntity> getUserDetail(@Query("uid") String uid);

    /**
     * 获取用户信息 , 歌单，收藏，mv, dj 数量
     *
     * @return
     */
    @POST("user/subcount")
    Observable<MineUserInfoEntity> getUserInfo();

    /**
     * 获取用户歌单
     *
     * @return
     */
    @POST("user/playlist")
    Observable<MinePlayListEntity> getPlaylist(@Query("uid") String uid);

    /**
     * 获取用户电台
     *
     * @return
     */
    @POST("user/dj")
    Observable<MineRadioStationEntity> getUserRadioStation(@Query("uid") String uid);

    /**
     * 我的数字专辑
     *
     * @return
     */
    @POST("digitalAlbum/purchased")
    Observable<MinePurchasedEntity> getPurchased(@Query("limit") int limit);

    /**
     * 获取用户播放记录
     *
     * @param uid  用户id
     * @param type type=1 时只返回 weekData, type=0 时返回 allData
     * @return
     */
    @POST("user/record")
    Observable<MineRecordEntity> getRecord(@Query("uid") String uid,
                                           @Query("type") String type);

    /**
     * 喜欢音乐列表
     *
     * @param uid 用户id
     * @return
     */
    @POST("likelist")
    Observable<Object> getUserLikeList(@Query("uid") String uid);

    /**
     * 推荐电台
     *
     * @return
     */
    @POST("personalized/djprogram")
    Observable<RecommendRadioStationEntity> getDjProgram();

    /**
     * 私人fm
     *
     * @return
     */
    @POST("personal_fm")
    Observable<PersonFmEntity> getPersonFm();

    /**
     * 推荐节目
     *
     * @return
     */
    @POST("program/recommend")
    Observable<Object> getRecommend();

    /**
     * 独家放送
     *
     * @return
     */
    @POST("personalized/privatecontent")
    Observable<Object> getPrivateContent();

    /**
     * 获取每日推荐歌单
     *
     * @return
     */
    @POST("recommend/resource")
    Observable<RecommendEveryDayEntity> getRecommendEveryDay();

    /**
     * 获取每日推荐歌单
     *
     * @return
     */
    @POST("recommend/songs")
    Observable<Object> getRecommendSongEveryDay();

    /**
     * 推荐新音乐
     *
     * @return
     */
    @POST("personalized/newsong")
    Observable<RecommendnewSongEntity> getRecommendNewSong();

    /**
     * 最新专辑
     *
     * @return
     */
    @POST("album/newest")
    Observable<NewAlbumEntity> getNewEst();

    /**
     * 新碟上架
     *
     * @return
     */
    @POST("top/album")
    Observable<NewAlbumEntity> getTopNewEst(@Query("offset") int offset, @Query("limit") int limit);

    /**
     * 搜索多重匹配
     *
     * @return
     */
    @POST("search/multimatch")
    Observable<Object> getSearch(@Query("keywords") String keywords);

    /**
     * 排行榜
     *
     * @return
     */
    @POST("top/list")
    Observable<RankingListEntity> getRankingList(@Query("idx") String idx);

    /**
     * 退出登陆
     *
     * @return
     */
    @POST("logout")
    Observable<Object> loginOut();

}
